<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>instanceof</title>
</head>
<body>
<script>
  /*
  * instanceof用来判断一个对象是否有指定的构造函数创建 还考虑到了继承
  * 若不考虑到继承 那么instanceof的原理应该是  A instance of Class  => A.__proto__ = Class.prototype
  * 但是考虑到继承的话 会将A的原型链上的对象一一与 Class.prototype进行比较
  * */


  /*
  * obj instanceof Animal 运算之前首先会去检查Animal身上有没有实现 static [Symbol.hasInstance]
  * 这个函数会将obj作为函数参数传入 如果这个函数的返回结果是true/false 就直接返回true/false 如果没有实现
  * 这个方法的话那么就去检查原型链
  * */

  class Animal {
     static [Symbol.hasInstance](obj){
       return  typeof obj.a != 'undefined'
     }
  }

  let obj ={
    a:1
  }

  console.log(obj instanceof Animal);

  /*
  * instanceof的本质是根据原型进行判断
  * 所以 instanceof左右的任意一方只要将原型修改了就会判断失败
  *
  * 因为class的原型不可变 所以只能使用构造函数来演示
  * */

  console.log('---');



  function Room() {
    
  }
  let room = new Room()
  console.log(room instanceof Room);

  Room.prototype = {}

  console.log(room instanceof Room);
  console.log(new Room() instanceof Room);









</script>
</body>
</html>